﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BusinessLogic.Entities;
using DataTier;

namespace BusinessLogic.Helpers
{
    /// <summary>
    /// Хэлпер для работы с пользовательскими бизнес-объектами
    /// </summary>
    public static class EntityHelper
    {
        #region Блок методов для прав доступа

        /// <summary>
        /// Возвращает пользовательский класс UserSecurityDetails с полной информацией о пользователе и его правах доступа
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public static UserSecurityDetails GetUserSecurityDetails(User user)
        {
            if (user == null)
                return null;

            UserSecurityDetails entity = new UserSecurityDetails()
            {
                Id = user.Id,
                FIO = user.FIO,
                Email = user.Email,
                Phone = user.Phone,
                Login = user.Login,
                Pass = user.Pass,
                Enabled = user.Enabled,
                Deleted = user.Deleted
            };

            //Информация о группах ролей пользователя
            if (user.RoleGroup != null && user.RoleGroup.Count > 0)
            {
                entity.Groups = new List<RoleGroupEntity>();
                foreach (var group in user.RoleGroup)
                {
                    entity.Groups.Add(EntityHelper.GetRoleGroupEntity(group));
                }
            }

            return entity;
        }


        /// <summary>
        /// Возвращает пользовательский класс RoleGroupEntity
        /// </summary>
        /// <param name="roleGroup"></param>
        /// <returns></returns>
        public static RoleGroupEntity GetRoleGroupEntity(RoleGroup roleGroup)
        {
            if (roleGroup == null)
                return null;

            RoleGroupEntity entity = new RoleGroupEntity()
            {
                Id = roleGroup.Id,
                Name = roleGroup.Name
            };

            if (roleGroup.Role != null && roleGroup.Role.Count > 0)
            {
                entity.Roles = new List<RoleEntity>();
                foreach (var role in roleGroup.Role)
                {
                    entity.Roles.Add(EntityHelper.GetRoleEntity(role));
                }
            }

            return entity;
        }



        /// <summary>
        /// Возвращает пользовательский класс RoleEntity с полной информацией о РОЛИ пользователя
        /// </summary>
        /// <param name="role"></param>
        /// <returns></returns>
        public static RoleEntity GetRoleEntity(Role role)
        {
            if (role == null)
                return null;

            RoleEntity entity = new RoleEntity()
                {
                    Id = role.Id,
                    Name = role.Name,
                    Description = role.Description,
                    Deleted = role.Deleted,
                    OnlyIts = role.OnlyIts
                };

            // Выбираем список разрешенных пунктов меню
            if (role.PermissionMenu != null && role.PermissionMenu.Count > 0)
                entity.PermissionMenus = role.PermissionMenu.Where(pm => pm.Menu.ParentId == null).Select(pm => EntityHelper.GetPermissionMenuEntity(pm)).ToList();

            // Выбираем список разрешенных для работы статусов (разрешения для перевода в этот статус)
            if (role.PermissionState != null && role.PermissionState.Count > 0)
                entity.PermissionStates = role.PermissionState.Select(ps => EntityHelper.GetPermissionStateEntity(ps)).ToList();

            // Выбираем список разрешенных для работы действий
            if (role.PermissionMVCAction != null && role.PermissionMVCAction.Count > 0)
                entity.PermissionMVCActions = role.PermissionMVCAction.Select(pa => EntityHelper.GetPermissionMVCActionEntity(pa)).ToList();
            
            return entity;
        }


        /// <summary>
        /// Возвращает пользовательский класс PermissionMenuEntity
        /// </summary>
        /// <param name="permissionMenu"></param>
        /// <returns></returns>
        public static PermissionMenuEntity GetPermissionMenuEntity(PermissionMenu permissionMenu)
        {
            if (permissionMenu == null)
                return null;

            PermissionMenuEntity entity = new PermissionMenuEntity();
            entity.Menu = EntityHelper.GetMenuEntity(permissionMenu.Menu);
            entity.PermissionName = permissionMenu.Permission.Name;
            return entity;
        }


        /// <summary>
        /// Возвращает пользовательский класс PermissionStateEntity
        /// </summary>
        /// <param name="permissionState"></param>
        /// <returns></returns>
        public static PermissionStateEntity GetPermissionStateEntity(PermissionState permissionState)
        {
            if (permissionState == null)
                return null;

            PermissionStateEntity entity = new PermissionStateEntity();
            entity.State = EntityHelper.GetStateEntity(permissionState.State);
            entity.PermissionName = permissionState.Permission.Name;
            return entity;
        }


        /// <summary>
        /// Возвращает пользовательский класс PermissionMVCActionEntity
        /// </summary>
        /// <param name="permissionState"></param>
        /// <returns></returns>
        public static PermissionMVCActionEntity GetPermissionMVCActionEntity(PermissionMVCAction permissionMVCAction)
        {
            if (permissionMVCAction == null)
                return null;

            PermissionMVCActionEntity entity = new PermissionMVCActionEntity();
            entity.MVCAction = EntityHelper.GetMVCActionEntity(permissionMVCAction.MVCAction);
            entity.PermissionName = permissionMVCAction.Permission.Name;
            return entity;
        }


        /// <summary>
        /// Возвращает пользовательский класс MenuEntity
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        public static MenuEntity GetMenuEntity(Menu menu)
        {
            if (menu == null)
                return null;

            MenuEntity entity = new MenuEntity()
            {
                Id = menu.Id,
                Name = menu.Name,
                ToolTip = menu.ToolTip
            };

            // Формируется информация о ссылке на метод контроллера, который будет выполняться при клике на пункт меню
            if (menu.MVCAction != null)
                entity.MVCActionEntity = EntityHelper.GetMVCActionEntity(menu.MVCAction);

            // Формируется список объектов - дочерние пункты меню
            if (menu.Menu1 != null && menu.Menu1.Count > 0)
            {
                entity.ChildMenus = new List<MenuEntity>();
                foreach (var child in menu.Menu1)
                {
                    var childMenu = EntityHelper.GetMenuEntity(child);
                    childMenu.ParentMenu = entity; // У дочерних пунктов меню родительский объект - текущее Меню
                    entity.ChildMenus.Add(childMenu);
                }
            }

            return entity;
        }


        /// <summary>
        /// Возвращает пользовательский класс StateEntity
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
        public static StateEntity GetStateEntity(State state)
        {
            if (state == null)
                return null;

            StateEntity entity = new StateEntity()
            {
                Id = state.Id,
                Color = state.Color,
                Description = state.Description,
                Name = state.Name
            };

            return entity;
        }


        /// <summary>
        /// Возвращает пользовательский класс MVCActionEntity
        /// </summary>
        /// <param name="mvcAction"></param>
        /// <returns></returns>
        public static MVCActionEntity GetMVCActionEntity(MVCAction mvcAction)
        {
            if (mvcAction == null)
                return null;

            MVCActionEntity entity = new MVCActionEntity()
            {
                Id = mvcAction.Id,
                Controller = mvcAction.Controller,
                Name = mvcAction.Name
            };

            return entity;
        }



        #endregion Блок методов для прав доступа


        #region Блок методов для товаров и групп товаров

        public static ProductEntity GetProductEntity(DataTier.Product product)
        {
            if (product == null)
                return null;

            var entity = new ProductEntity()
            {
                Id = product.Id,
                GroupId = product.GroupId, // Надо создавать дочернюю сущность
                TypeId = product.TypeId, // Надо создавать дочернюю сущность
                Articul = product.Articul,
                Name = product.Name,
                Price = product.Price,
                ImageBigUrl = product.ImageBigUrl,
                ImageSmallUrl = product.ImageSmallUrl,
                CreatedUserId = product.CreatedUserId, // Надо создавать дочернюю сущность
                CreatedDate = product.CreatedDate,
                Deleted = product.Deleted,
                DeletedUserId = product.DeletedUserId, // Надо создавать дочернюю сущность
                DeletedDate = product.DeletedDate
            };

            return entity;
        }

        #endregion Блок методов для товаров и групп товаров

    }
}
